package fr.demos.cinepantin.controleur;

import java.io.IOException;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;

import javax.inject.Inject;
import javax.servlet.RequestDispatcher;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;


import fr.demos.cinepantin.Livre;
import fr.demos.cinepantin.dao.DaoLivre;
import fr.demos.cinepantin.dao.impl.UploadImage;
import fr.demos.cinepantin.dao.interfac.LivreDao;
import fr.demos.cinepantin.dao.interfac.UploadInterface;
import fr.demos.cinepantin.enumerate.Anciennete;
import fr.demos.cinepantin.enumerate.Categorie;
import fr.demos.cinepantin.enumerate.Tva;
import fr.demos.cinepantin.exception.DaoExceptions;
import fr.demos.cinepantin.exception.UploadImageExceptions;
import fr.demos.cinepantin.exception.UploadImageMauvaisFormatExceptions;
import fr.demos.cinepantin.util.Configuration;

/**
 * @author CQP-DNT Servlet implementation class SaisirLivre
 */
@WebServlet("/SaisirLivre")
public class SaisirLivre extends HttpServlet {
	private static final long serialVersionUID = 1L;

	@Inject
	@DaoLivre
	private LivreDao livredao;

	/**
	 * @see HttpServlet#HttpServlet()
	 */
	public SaisirLivre() {
		super();
		// TODO Auto-generated constructor stub
	}

	/**
	 * @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse
	 *      response)
	 */
	protected void doGet(HttpServletRequest request,
			HttpServletResponse response) throws ServletException, IOException {
		RequestDispatcher rd;
		request.setAttribute("page", "/saisirLivre.jsp");

		/**
		 * Action Afficher les details d'un livre en recuperant les images
		 */

		String action = (String) request.getParameter("action");
		Integer idLivre = null;
		Livre livre = null;

		try {
			// si l'action de modifier un article
			if (action != null && action.equals("modification")) {
				idLivre = Integer.parseInt(request.getParameter("id"));
				// recupere l'article par son id
				livre = livredao.getLivreById(idLivre);
				// on met en parametre les valeurs du chapitre
				request.setAttribute("idLivre", livre.getId());
				request.setAttribute("isbn", livre.getIsbn());
				request.setAttribute("titre", livre.getTitre());
				request.setAttribute("resume", livre.getResume());
				request.setAttribute("anciennete", livre.getAnciennete());
				request.setAttribute("anneeDeSortie", livre.getAnneeDeSortie());
				request.setAttribute("tva", livre.getTva());
				//request.setAttribute("categorie", livre.getCategorie());
				request.setAttribute("prixVente", livre.getPrixVente());
				request.setAttribute("stock", livre.getStock());

			}
		} catch (DaoExceptions e) {
			request.setAttribute("erreurPage",
					"Impossible de récupérer ce livre. Veuillez recommencer plus tard");
		}

		rd = request.getRequestDispatcher("/page.jsp");
		rd.forward(request, response);
	}

	/**
	 * @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse
	 *      response)
	 */
	protected void doPost(HttpServletRequest request,
			HttpServletResponse response) throws ServletException, IOException {

		// action uploader une image
		String action = request.getParameter("action");

		if (action != null && action.equals("uploadImage")) {
			UploadInterface uploadImage = new UploadImage();
			List<String> listFilesNames;
			try {
				listFilesNames = uploadImage.UploadFile(request);

				for (String fileName : listFilesNames) {
					System.out.println(Configuration
							.getAbsolutePathDossierUploadImage(request)
							+ fileName);
					request.setAttribute("srcImage", Configuration.SERVLET_AFFICHER_IMAGE + "?src="
									+ fileName);
				}
			} catch (UploadImageMauvaisFormatExceptions e) {
				System.out.println("problème upload image");
				request.setAttribute("erreurImage",
						"le format de l'image n'est pas reconnu");

			} catch (UploadImageExceptions e) {
				request.setAttribute("erreurImage",
						"Un problème est survenu durant l'upload de l'images");
				// Impossible d'enregistrer l'image
				e.printStackTrace();
			}
			request.setAttribute("page", "/saisirLivre.jsp");
			RequestDispatcher rd = request.getRequestDispatcher("/page.jsp");
			rd.forward(request, response);
		}

		/**
		 * Saisir un livre en recuperant le id article
		 * 
		 */
		Integer idLivre = null;
		String isbn = null;
		String titre = null;
		String auteur = null;
		String resume = null;
		String edition = null;
		Anciennete anciennete = null;
		int anneeDeSortie = 0;
		Tva tva = null;
		// Categorie categorie = null;
		double prixVente = 0;
		int stock = 0;
		String livreAjouter = titre;

		ArrayList<String> erreurs = new ArrayList<>();

		HttpSession session = request.getSession();
		RequestDispatcher rd = null;

		try {
			idLivre = Integer.parseInt(request.getParameter("id"));
		} catch (NumberFormatException e) {
			idLivre = null;
		}

		isbn = (String) request.getParameter("isbn");

		titre = (String) request.getParameter("titre");
		if (titre == null || titre.equals("")) {
			erreurs.add("Nom du titre requis");
		}

		if (titre != null && titre.length() > 30) {
			System.out.println("Le titre d�passe la taille du champs");
			erreurs.add("Le titre d�passe la taille du champs");
		}

		try {
			auteur = (String) request.getParameter("auteur");
		} catch (Exception e) {
			e.printStackTrace();
			request.setAttribute("erreurPage",
					" Veuillez recommencer plus tard");
		}

		try {
			resume = (String) request.getParameter("resume");
		} catch (Exception e) {

			e.printStackTrace();
			request.setAttribute("erreurPage",
					" Veuillez recommencer plus tard");
		}

		try {
			edition = (String) request.getParameter("edition");
		} catch (Exception e) {
			e.printStackTrace();
			request.setAttribute("erreurPage",
					" Veuillez recommencer plus tard");

		}

		try {
			anciennete = Anciennete.valueOf(request.getParameter("anciennete"));
		} catch (Exception e) {
			erreurs.add("choissisez l'anciennete");
		}
		try {
			anneeDeSortie = Integer.parseInt(request
					.getParameter("anneeDeSortie"));
		} catch (NullPointerException e) {
			erreurs.add("veuillez entrer l'année de sorti");
		}
		try {
			tva = Tva.valueOf(request.getParameter("tva"));
		} catch (NullPointerException e) {
			erreurs.add("choissisez une valeur");
		}
//		try {
//			categorie = Categorie.valueOf(request.getParameter("categorie"));
//		} catch (NullPointerException e) {
//			erreurs.add("Categorie obligatoire");
//		}

		try {
			prixVente = Double.parseDouble(request.getParameter("prixVente"));
		} catch (NumberFormatException e) {
			erreurs.add("Vous devez entrer le prix de vente");
		}

		try {
			stock = Integer.parseInt(request.getParameter("stock"));
		} catch (NumberFormatException e) {
			erreurs.add("stock invalide !");
		}

		if (erreurs.size() > 0) {
			request.setAttribute("erreurs", erreurs);
			request.setAttribute("idLivre", idLivre);
			request.setAttribute("isbn", isbn);
			request.setAttribute("titre", titre);
			request.setAttribute("auteur", auteur);
			request.setAttribute("resume", resume);
			request.setAttribute("edition", edition);
			request.setAttribute("anciennete", anciennete);
			request.setAttribute("anneeDeSortie", anneeDeSortie);
			request.setAttribute("tva", tva);
			// request.setAttribute("categorie", categorie);
			request.setAttribute("prixVente", prixVente);
			request.setAttribute("stock", stock);

			request.setAttribute("Création non effectuée dans la base ",
					erreurs);
			request.setAttribute("page", "/saisirLivre.jsp");
		} else {
			if (idLivre == null) {
				Livre liv;
				liv = new Livre(isbn, titre, auteur, edition, resume,
						anciennete, anneeDeSortie, tva, prixVente, stock);

				try {
					livredao.addLivre(liv); // apprenant a ajouter en parametre
					request.setAttribute(
							"Vous venez d'ajouter un livre : Titre = " + titre
									+ "dans le base", livreAjouter);
					request.getRequestDispatcher("/AfficherLivre").forward(
							request, response);
				} catch (DaoExceptions e) {
					e.printStackTrace();
					erreurs.add("erreur ajout de ce livre");
					request.setAttribute("page", "/saisirLivre.jsp");
				}
			} else {
				Livre livre = new Livre(isbn, titre, auteur, edition, resume,
						anciennete, anneeDeSortie, tva, prixVente, stock);
				try {
					livredao.modifierLivre(livre);
					request.setAttribute("page", "/AfficherLivre");
				} catch (DaoExceptions e) {
					e.printStackTrace();
					erreurs.add("erreur modification livre");
					request.setAttribute("page", "/saisirLivre.jsp");
				}
			}
			rd = request.getRequestDispatcher("/page.jsp");
			rd.forward(request, response);
		}
		rd = request.getRequestDispatcher("/page.jsp");
		rd.forward(request, response);

	}
}
